package com.vlyman.captcha;


import lombok.Getter;
import lombok.Setter;

import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.Random;

/**
 * 类描述：
 *  验证码抽象类
 * @author chenjs
 * @date 2018/12/21 17:14
 **/
@Getter
@Setter
public abstract class AbstractCaptcha {
    /**
     * 字体
     */
    protected Font font = new Font("Verdana", Font.ITALIC|Font.BOLD, 28);

    /**
     * 验证码随机字符长度
     */
    protected int len = 5;

    /**
     * 验证码显示跨度
     */
    protected int width = 120;

    /**
     * 验证码显示高度
     */
    protected int height = 40;

    /**
     * 随机字符串
     */
    private String code = null;

    /**
     * 定义验证码字符.去除了O和I等容易混淆的字母
     */
    public static final char CODE_SEQUENCE[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
            'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    /**
     * 方法描述：
     *   验证码输出抽象方法，由子类实现
     *  @author chenjs
     *  @param os 输出流
     *  @date 2018/12/21 12:34
     */
    public abstract void out(OutputStream os);

    /**
     * 方法描述：
     *   验证码输出为base64字符串
     *  @author chenjs
     *  @param os 输出流
     *  @return String base64字符串
     *  @date 2018/12/21 12:34
     */
    public abstract String base64Out(ByteArrayOutputStream os);

    /**
     * 方法描述：
     *   验证码以图片形式输出
     *  @author chenjs
     *  @param path 验证码图片输出路径
     *  @date 2018/12/22 09:12
     */
    public abstract void fileOutput(String path);

    /**
     * 方法描述：
     *   生成随机字符验证码
     *  @author chenjs
     *  @return String
     *  @date 2018/12/21 12:27
     */
    protected String createCode() {
        StringBuffer randomCode = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < len; i++) {
            String strRand = String.valueOf(CODE_SEQUENCE[random.nextInt(CODE_SEQUENCE.length)]);
            randomCode.append(strRand);
        }
        return randomCode.toString();
    }

    /**
     * 方法描述：
     *   生成随机颜色
     *  @author chenjs
     *  @return Color
     *  @date 2018/12/21 12:30
     */
    protected Color createColor() {
        Random random = new Random();
        int red = random.nextInt(255);
        int green = random.nextInt(255);
        int blue = random.nextInt(255);
        return new Color(red, green, blue);
    }
    
    /**
     * 方法描述：
     *   根据每个验证字符生成一个随机颜色
     *  @author chenjs
     *  @param code 验证码
     *  @return Color[] 每个验证字符对应的随机颜色
     *  @date 2018/12/21 17:42
     */
    protected Color[] createCodeRandomColor(String code) {
        Color[] fontColorArr = new Color[len];
        for (int i = 0; i < len; i++) {
            fontColorArr[i] = createColor();
        }
        return fontColorArr;
    }
}
